# 变量
# name：变量名
# 命名规则：大小写字母、数字、下划线 _ 、不能以数字开头、不能是系统关键字
name = "张三"
print(name)
NAME = "李四"
print(NAME)
nameN_2 = "王五"
print(nameN_2)

# 查看python的所有关键字
import keyword

print(keyword.kwlist)

# 赋值 =
# 变量在定义的时候就需要赋值

# 注释：帮助理解代码
# # 表示一行注释  类似于c中 //
""" 成对的三个双引号 多行注释 相当于 /* */
这是第一行注释
这是第二行注释
这是第N行注释
"""
''' 成对的三个单引号 多行注释 相当于 /* */
这是第一行注释
这是第二行注释
这是第N行注释
'''
# 在python中 不管是单引号 还是双引号 都表示字符串

# 运算
# + - * /
# a**b a的b次方
# // 两个数相除 向下取整
# % 两个数相除取余数
print(10 % 3)  # 1
print(10 // 4)  # 2
print(2 ** 10)  # 1024

# 五大基本数据类型
# 整型int（整数）、浮点类型float（小数）、字符串类型str（一串字符）、布尔类型bool(True\False)、NoneType（None）
# type(变量) 返回变量的类型
a = None
print(type(a))

# 类型转换
# int()、str()、bool()、float()

# int to str
b = 123456
print(b, type(b))
c = str(b)
print(c, type(c))
print(c.split("4"))

# str to int
e = "123"
f = "100"
print(e + f)  # 123100
g = int(e)
print(g, type(g))
h = int(f)
print(h, type(h))
print(g + h)  # 223

# int to bool
# 除0（0，0.0，-0）以外都是True
i = -0
print(bool(i))
# str to bool
# 除了空字符串以外 都是 True
j = "Tru"
h = "False"
k = ""
print(bool(j))  # True
print(bool(h))  # True
print(bool(k))  # False

# GIT

# 又写了一行代码
# 又又写了一行代码

# 数据容器（数据结构）
# list、tuple、dict、set

# 保存N个学生的姓名
student1 = "xxx"
student2 = "xxx"
student3 = "xxx"
student4 = "xxx"
studentN = "xxx"

# list 列表 数组
# 张三 李四 王五
# 定义： [元素1、元素2、元素3......]
# 特点：有序，元素可以重复，元素的类型可以不唯一，元素可以变化，查找速度会随着长度的增加而变慢
list1 = ["张三", "李四", "王五"]
print(list1, type(list1))
# 索引
# list1[index] index从0开始
print(list1[1])
print(list1[2])

# 切片
# list1[起始位置:结束位置:步长]
# 左闭右开 [起始位置,结束位置)
# 起始位置：默认是0
# 结束位置：默认是len(list1) len()可以获取list的长度
# 步长：默认是1，隔几个元素取一个
print(list1[1:3:1])

list2 = [1, 2, 3, 4, 5, 6, 7]
print(list2[2:6:1])  # 3,4,5,6
print(list2[0:5:2])  # 1,3,5
print(list2[0:7:3])  # 1,4,7
print(list2[::])
print(len(list2))
# -index：从右往左数第几个
print(list2[-2])
# 倒转 [1,2,3,4,5,6,7] => [7,6,5,4,3,2,1]
print(list2[-1:-8:-1])
print(list2[::-1])

# 常用的方法
# 排序、计数、插入、添加、移除......
list3 = [1, 3, 2, 6, 5, 4, 7, 2, 9, 8]
print(list3)
list3.sort()
print(list3)
list3.sort(reverse=True)
print(list3)

print(list3.count(3))

list4 = [1, 2, 3, "abc", "张三", 1.1, True]
print(list4)

# tuple 元组
# 定义 tuple1 = (元素1、元素2、元素3......)
# 特点：有序，元素可以重复，元素的类型可以不唯一，元组一旦创建就不能进行修改了
tuple1 = (1, 2, 2, "33", 3, 4, 5)
print(tuple1, type(tuple1))
# 也支持同list一样的切片操作
print(tuple1[3])
# 没有insert remove sort append......这样的方法
# 元组一旦定义 就不能修改

# dict 字典
# 每一个元素都是k-v格式的
# 定义：{"key":"value","k1":"v1","k2":"v2"......}
# 特点：查找速度非常快，不会因为元素个数太多导致速度变慢
dict1 = {"k1": "v1", "k2": "v2", "k3": "v3"}

# 通过k获取v
print(dict1["k2"])
print(dict1.get("k1"))
# k4不存在，直接报错KeyError
# print(dict1["k4"])
# 当传入的key不存在时，不会报错，并且能够指定 找不到的默认返回值
print(dict1.get("k4", "如果查不到就返回我"))

# dict的key必须是不可变的
list1 = [1, 2, 3]
tuple1 = (1, 2, 3)

# dict2 = {list1:"v1"}
dict3 = {tuple1: "tupleV1"}

# set 集合
# 定义 {元素1,元素2,元素3......}
# 特点：元素不能重复（会自动去重）
set1 = {1, 2, 3, 4}
print(set1, type(set1))
# set会对重复的元素自动去重
set2 = {1, 1, 1, 2, 3, 3, 4, 4, 4, 5}
print(set2)